package com.ljy.my_study.leetcode.螺旋矩阵;

import com.ljy.my_study.util.ArrayUtil;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lijunying
 * @date 2021/9/6 17:09
 */
public class TestMain {

//    给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。
//
//             
//
//    示例 1：
//
//
//    输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
//    输出：[1,2,3,6,9,8,7,4,5]
//    示例 2：
//
//
//    输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
//    输出：[1,2,3,4,8,12,11,10,9,5,6,7]
//             
//
//    提示：
//
//    m == matrix.length
//    n == matrix[i].length
//1 <= m, n <= 10
//            -100 <= matrix[i][j] <= 100
//
//    来源：力扣（LeetCode）
//    链接：https://leetcode-cn.com/problems/spiral-matrix
//    著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

    public static void main(String[] args) {
        System.out.println(new TestMain().spiralOrder(ArrayUtil.changeStr2Array("[[1,2,3],[4,5,6],[7,8,9]]")));
    }

    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> result=new ArrayList<>();
        int[][] directs={{0,1},{1,0},{0,-1},{-1,0}};
        int[][] lenChangeArray={{1,0,0,0},{0,0,0,-1},{0,-1,0,0},{0,0,1,0}};
        int xLen=matrix.length;
        int yLen=matrix[0].length;
        int xLeft=0;
        int xRight=xLen-1;
        int yLeft=0;
        int yRight=yLen-1;
        int x=0;
        int y=0;
        int count=0;
        result.add(matrix[x][y]);
        while(true){
            int index=count%4;
            int[] d=directs[index];
            int newX=x+d[0];
            int newY=y+d[1];
            if(xLeft>xRight||yLeft>yRight){
                break;
            }
            if(newX>=xLeft&&newX<=xRight&&newY>=yLeft&&newY<=yRight){
                x=newX;
                y=newY;
                result.add(matrix[x][y]);
            }else{
                count++;
                xLeft+=lenChangeArray[index][0];
                xRight+=lenChangeArray[index][1];
                yLeft+=lenChangeArray[index][2];
                yRight+=lenChangeArray[index][3];
            }
        }
        return result;
    }
}
